# 学生成绩管理系统
# 命令行版本
# 界面版
# 网络版

# 导入各种内部包
from tkinter import *
import threading
import _thread
import socket
import tkinter.ttk

# 设置初始数据
PORT = 9998
clients = []
students = [{'学号':'1001','姓名':'张三','语文':'87','数学':'98','外语':'100'},
            {'学号':'1002','姓名':'李四','语文':'97','数学':'89','外语':'77'},
            {'学号':'1003','姓名':'王五','语文':'84','数学':'55','外语':'99'},
            {'学号':'1004','姓名':'赵六','语文':'84','数学':'55','外语':'99'}]




# 服务器处理用户连入
class Dealing_client_connect(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ss.bind(("192.168.0.91", PORT))             # 服务器绑定地址和端口
        print(f"学生成绩管理服务器已启动，开始监听{PORT}端口")
        ss.listen(5)
        global s
        while True:
            conn,addr = ss.accept()       # 其中 ss.accept接收的内容 分配一个专门处理端口 conn 而信息来源的地址 寄存在addr
            print("有客户端连入",conn,addr)
            clients.append(conn)

            s = conn                     # 这里是将分配的处理端口地址 给变量 s
            # 新开线程处理该客户端的信息
            t2 = Dealing_client_information(conn,addr)
            t2.start()

#  先不用服务器版本 先实现单机版本
# t1 = Dealing_client_connect()   # 开启客户端 并监听用户连入
# t1.start()

# 处理其中一个客户端的输入内容
class Dealing_client_information(threading.Thread):

    def __init__(self,conn,addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        global m
        while True:
            data = self.conn.recv(1024)
            if data:
                print(data)
                m += data.decode() + "\n"
                message.config(text=m)

                # 转发给所有客户端
                for i in range(len(clients)):
                    clients[i].send(data)

            else:
                break




class add(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
# 学生信息添加功能按钮
    def run(self):
        print('1.增加学生成绩信息')
        number = input('请输入学生学号：')
        name = input('请输入学生姓名：')
        chineseGrade = input('请输入学生语文成绩：')
        mathGrade = input('请输入学生数学成绩：')
        englishGrade = input('请输入学生外语成绩：')
        students.append({'学号': number, '姓名': name, '语文': chineseGrade, '数学': mathGrade, '外语': englishGrade})
# 开启添加学生信息的一个线程
# add1 = threading.Thread(target=add)
# 这里是启动一个线程
# add1.start()

add_information = add()
def add_click():         # 控制添加学生信息（线程）的开关
    add_information.start()


def delete():
    number = input('请输入需要删除学生的学号：')
    for student in students:
        if student['学号'] == number:
            students.remove(student)
delete1 = threading.Thread(target=delete)
# delete1.start()

def modify():
    number = input('请输入需要修改的学生学号：')
    name = input('请输入需要修改的学生的姓名：')
    chiese = input('请输入需要修改的学生的语文成绩：')
    math = input('请输入需要修改的学生的数学成绩：')
    english = input('请输入需要修改的学生的英语成绩：')
    for student in students:
        if student['学号'] == number:
            student['姓名'] = name
            student['语文'] = chiese
            student['数学'] = math
            student['外语'] = english
            break

def search():
    pass

def save():
    pass

# 显示所有学生信息
def showall():
    students_save = [[] for i in range(len(students))]    # 创建数据存储空间
    for j in range(len(students)):
        students_save[j].append(students[j]['学号'])
        students_save[j].append(students[j]['姓名'])
        students_save[j].append(students[j]['语文'])
        students_save[j].append(students[j]['数学'])
        students_save[j].append(students[j]['外语'])
    for k in range(len(students_save)):
        table.insert('', k, text=f'{k + 1}', values=students_save[k])

# 窗口生成
root = Tk()
root.title("学生管理系统服务器")
root.geometry("730x730")

# 添加背景图片
img1 = PhotoImage(file='iu(1).png')
labelImg2 = Label(root,image=img1)
labelImg2.pack()

# 创建表格
table = tkinter.ttk.Treeview()
table['columns'] = ('number','name','chinesegrade','mathgrade','englishgrade')    # 设定表头字段

table.heading('number',text='学号')     # 设定对应字段的文字内容
table.heading('name',text='姓名')
table.heading('chinesegrade',text='语文成绩')
table.heading('mathgrade',text='数学成绩')
table.heading('englishgrade',text='英语成绩')

table.column('number',width=100)
table.column('name',width=100)
table.column('chinesegrade',width=100)
table.column('mathgrade',width=100)
table.column('englishgrade',width=100)

# 还少一个插入数据 ！！！！！！！！！！！！！！！！！！

table.place(x=15,y=100)

# 添加功能按钮    显示全部  增、删、改、查  保存   6个功能按钮
btn_showall = Button(root,text='显示所有学生信息',command=showall)
btn_showall.place(x=30,y=350)
btn_add = Button(root,text='添加学生信息',command=add_click)
btn_add.place(x=150,y=350)
btn_delete = Button(root,text='删除学生信息',command=delete1)
btn_delete.place(x=150,y=380)
btn_modify = Button(root,text='更改学生信息',command=modify)
btn_modify.place(x=150,y=410)
btn_search = Button(root,text='查询学生信息',command=search)
btn_search.place(x=150,y=440)
btn_save = Button(root,text='保存所有学生信息',command=save)
btn_save.place(x=30,y=440)



# 显示提示信息
message = Message(root,text="学生信息管理",font=('Arial,20'),width=200)
message.place(x=300,y=10)







root.mainloop()